package com.imooc.retry;

import com.imooc.exception.GraceException;
import com.imooc.exception.MyException;
import com.imooc.result.ResponseStatusEnum;
import com.imooc.utils.SMSUtilsRetry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

/**
 * @author liansen
 * @create 02-15-9:30
 */

@Slf4j
@Component
public class RetryComponent {

//    @Retryable(
//            value = IllegalArgumentException.class, //指定重试的异常,不是这个异常则不重试;不写的话都会重试
//            maxAttempts = 5, //重试的次数
//            backoff = @Backoff(     //重试的间隔时间
//                    delay = 1000L,  //重试的间隔为1秒
//                    multiplier = 2  //multiplier:倍数, 后续重试间隔为前一次的2倍，第一次1秒，第二次2秒，第三次4秒，第四次8秒
//            )
//    )
//    public boolean sendSmsWithRetry(){
//        log.info("当前时间 Time={}", LocalDateTime.now());
//        return SMSUtilsRetry.sendSMS();
//    }
//
//    //兜底方法，达到最大重试次数或者抛出一个没有被重试的异常后进行调用
//    @Recover
//    public boolean recover(){
//        GraceException.display(ResponseStatusEnum.SYSTEM_ERROR);
//        return false;
//    }

    @Retryable(
            value = MyException.class, //触发MyException就会重试
            maxAttempts = 5, //重试的次数
            backoff = @Backoff(
                    delay = 1000L, //重试的时间间隔为1s
                    multiplier = 2 //multiplier:倍数, 后续重试间隔为前一次的2倍，第一次1秒，第二次2秒，第三次4秒，第四次8秒
            )
    )
    public String sendSmsWithRetry(){
        log.info("当前时间Time={}", LocalDateTime.now());
        String res = SMSUtilsRetry.sendSMSCode();
        log.info("res=" + res);
        return res;
    }

    //兜底方法，达到最大重试次数或者抛出一个没有被重试的异常后进行调用
    @Recover
    public String recover(){
        GraceException.display(ResponseStatusEnum.SYSTEM_ERROR);
        return "进入了兜底方法";
    }
}
